﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CANO.Data.DAOs
{
	public class CompromisoDAO
	{
		public int CompromisoID { get; set; }
		public int TipoCompromiso { get; set; }
		public DateTime FechaCompromiso { get; set; }
		public int UsuarioResponsable { get; set; }
		public int ContactoAsociado { get; set; }
		public int Estado { get; set; }
		public string TipoCompromisoDisplay { get; set; }
		public string ContactoAsociadoDisplay { get; set; }
		public List<UsuarioDAO> CompartidoCon { get; set; }
		public string FechaCompromisoDisplay { get; set; }
		public int ContactoAsociado2 { get; set; }
		public string ContactoAsociado2Display { get; set; }

		public int Create()
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				Compromiso newCompromiso = new Compromiso();
				newCompromiso.TipoCompromiso = this.TipoCompromiso;
				newCompromiso.FechaCompromiso = this.FechaCompromiso;
				newCompromiso.Usuario = this.UsuarioResponsable;
				newCompromiso.Contacto = this.ContactoAsociado;
				newCompromiso.Estado = this.Estado;
				newCompromiso.Contacto2 = this.ContactoAsociado2;
				context.Compromiso.InsertOnSubmit(newCompromiso);
				context.SubmitChanges();

				return newCompromiso.CompromisoID;
			}
		}

		public void Compartir(int UserID, int CompromisoID, int Tipo)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				if (Tipo == 2)
				{
					context.EntrevistaCompartida.InsertOnSubmit(new EntrevistaCompartida()
					{
						EntrevistaID = CompromisoID,
						UsuarioCompartido = UserID
					});
					context.SubmitChanges();
				}
				else
				{
					context.CompromisoCompartido.InsertOnSubmit(new CompromisoCompartido()
					{
						CompromisoID = CompromisoID,
						UsuarioCompartido = UserID
					});
					context.SubmitChanges();
				}
			}
		}

		public void Update()
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				var compromiso =
					(from c in context.Compromiso
					 where c.CompromisoID == this.CompromisoID
					 select c).Single();

				compromiso.TipoCompromiso = this.TipoCompromiso;
				compromiso.FechaCompromiso = this.FechaCompromiso;
				compromiso.Contacto = this.ContactoAsociado;
				if (this.ContactoAsociado2 == 0)
					compromiso.Contacto2 = 1;
				else
					compromiso.Contacto2 = this.ContactoAsociado2;
				
				context.SubmitChanges();
			}
		}

		internal List<CompromisoDAO> GetCurrentWeekManager()
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<CompromisoDAO> ListCompromiso = new List<CompromisoDAO>();

				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(6);

				var compromisos =
					from e in context.Compromiso
					where (e.FechaCompromiso >= stratDay && e.FechaCompromiso <= endDay)
					orderby e.FechaCompromiso ascending
					select e;

				foreach (var item in compromisos)
				{
					CompromisoDAO compromiso = new CompromisoDAO();
					compromiso.CompromisoID = item.CompromisoID;
					compromiso.ContactoAsociado = item.Contacto.Value;
					compromiso.Estado = item.Estado.Value;
					compromiso.FechaCompromiso = item.FechaCompromiso;
					compromiso.TipoCompromiso = item.TipoCompromiso;
					compromiso.UsuarioResponsable = item.Usuario;
					compromiso.CompartidoCon = this.GetUsersByCompromisoID(item.CompromisoID, item.TipoCompromiso);
					compromiso.ContactoAsociado2 = this.ContactoAsociado2;
					if (item.Contacto != null)
						compromiso.ContactoAsociadoDisplay = ContactoDAO.getContact(item.Contacto.Value.ToString()).FullName;
					if(item.Contacto2 != null)
						compromiso.ContactoAsociado2Display = ContactoDAO.getContact(item.Contacto2.Value.ToString()).FullName;
					ListCompromiso.Add(compromiso);
				}

				return ListCompromiso;
			}
		}

		public CompromisoDAO GetCompromisoByID(int CompromisoID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{

				var compromisos =
					from e in context.Compromiso
					where e.CompromisoID == CompromisoID
					select e;

				var comp = compromisos.SingleOrDefault();
				
					//CompromisoDAO compromiso = new CompromisoDAO();
					//compromiso.CompromisoID = comp.CompromisoID;
					//compromiso.ContactoAsociado = comp.Contacto.Value;
					//compromiso.Estado = comp.Estado.Value;
					//compromiso.FechaCompromiso = comp.FechaCompromiso;
					//compromiso.TipoCompromiso = comp.TipoCompromiso;
					//compromiso.UsuarioResponsable = comp.Usuario;
					//compromiso.TipoCompromisoDisplay = comp.TipoCompromiso1.TipoCompromiso1;

					return FillDAO(comp);
			}
		}

		internal List<CompromisoDAO> GetCurrentWeekByUser(int CurrentUserID)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<CompromisoDAO> ListCompromiso = new List<CompromisoDAO>();

				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(6);

				var compromisos =
					from e in context.Compromiso
					where e.Usuario == CurrentUserID
					orderby e.FechaCompromiso ascending
					select e;

				foreach (var item in compromisos)
				{
					CompromisoDAO compromiso = new CompromisoDAO();
					compromiso.CompromisoID = item.CompromisoID;
					compromiso.ContactoAsociado = item.Contacto.Value;
					compromiso.Estado = item.Estado.Value;
					compromiso.FechaCompromiso = item.FechaCompromiso;
					compromiso.TipoCompromiso = item.TipoCompromiso;
					compromiso.UsuarioResponsable = item.Usuario;
					if(item.Contacto2.HasValue)
						compromiso.ContactoAsociado2 = item.Contacto2.Value;
					compromiso.CompartidoCon = this.GetUsersByCompromisoID(item.CompromisoID, item.TipoCompromiso);
					compromiso.ContactoAsociadoDisplay = ContactoDAO.getContact(item.Contacto.Value.ToString()).FullName;
					if (item.Contacto2.HasValue)
						compromiso.ContactoAsociado2Display = ContactoDAO.getContact(item.Contacto2.Value.ToString()).FullName;
					ListCompromiso.Add(compromiso);
				}


				return ListCompromiso;
			}
		}

		public List<UsuarioDAO> GetUsersByCompromisoID(int CompromisoID, int Type)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<UsuarioDAO> listUser = new List<UsuarioDAO>();
				if (Type == 2)
				{
					var entrevistas =
						from e in context.Entrevista
						join cc in context.EntrevistaCompartida on e.EntrevistaID equals cc.EntrevistaID
						where (e.EntrevistaID == CompromisoID || cc.EntrevistaID == CompromisoID)
						select new { e, cc };

					foreach (var item in entrevistas)
					{
						if (item.cc.UsuarioCompartido != null)
							listUser.Add(new UsuarioDAO().getUser(item.cc.UsuarioCompartido));
						else
							listUser.Add(new UsuarioDAO().getUser(item.e.Usuario.Value));
					}
				}
				else
				{
					var compromisos =
						from e in context.Compromiso
						join cc in context.CompromisoCompartido on e.CompromisoID equals cc.CompromisoID
						where (e.CompromisoID == CompromisoID || cc.CompromisoID == CompromisoID)
						select new { e, cc };

					foreach (var item in compromisos)
					{
						if (item.cc.Usuario != null)
							listUser.Add(new UsuarioDAO().getUser(item.cc.Usuario.UsuarioID));
						else
							listUser.Add(new UsuarioDAO().getUser(item.e.Usuario));
					}
				}

				return listUser;
			}
		}


		public List<CompromisoDAO> GetAllByContact(int Contact)
		{
			using (CANOPropiedadesDCDataContext context = new CANOPropiedadesDCDataContext())
			{
				List<CompromisoDAO> listCompromisos = new List<CompromisoDAO>();

				var compromisos =
					from e in context.Compromiso
					where e.Contacto == Contact && e.FechaCompromiso > DateTime.Now
					select e;

					foreach (var item in compromisos)
					{
						listCompromisos.Add( FillDAO(item) );
					}
					return listCompromisos;
				}
		}

		private CompromisoDAO FillDAO(Compromiso Compromiso)
		{
			CompromisoDAO compromisoReturn =  new CompromisoDAO();
			compromisoReturn.CompromisoID = Compromiso.CompromisoID;
			
			if(Compromiso.Contacto.HasValue)
				compromisoReturn.ContactoAsociado = Compromiso.Contacto.Value;

			if(Compromiso.Estado.HasValue)
				compromisoReturn.Estado = Compromiso.Estado.Value;

			compromisoReturn.FechaCompromiso = Compromiso.FechaCompromiso;
			compromisoReturn.TipoCompromiso = Compromiso.TipoCompromiso;
			compromisoReturn.TipoCompromisoDisplay = Compromiso.TipoCompromiso1.TipoCompromiso1;
			compromisoReturn.UsuarioResponsable = Compromiso.Usuario;
//			compromisoReturn.ContactoAsociadoDisplay = Compromiso.Contactos.Nombre + " " + Compromiso.Contactos.Apellido;
			compromisoReturn.ContactoAsociadoDisplay = ContactoDAO.getContact(Compromiso.Contacto.Value.ToString()).FullName;
			compromisoReturn.ContactoAsociado2Display = ContactoDAO.getContact(Compromiso.Contacto2.Value.ToString()).FullName;
			compromisoReturn.CompartidoCon = this.GetUsersByCompromisoID(Compromiso.CompromisoID,  Compromiso.TipoCompromiso);
			compromisoReturn.FechaCompromisoDisplay = Compromiso.FechaCompromiso.ToShortDateString() + " " + Compromiso.FechaCompromiso.ToShortTimeString();
			if(Compromiso.Contacto2.HasValue)
				compromisoReturn.ContactoAsociado2 = Compromiso.Contacto2.Value;

			return compromisoReturn;
		}
	}
}
